#pragma once
#include <inttypes.h>

enum MEDIA_TYPE { MEDIA_UNIFORM, MEDIUM_LAYER, MEDIUM_ARBITARY, MEDIA_DYNAMIC };
enum METHOD_TYPE { METHOD_MONTECARLO, METHOD_SEMIANALYTIC };

class Params
{
public:
    Params();
    Params(int_fast64_t NPHOTON, double THRESHOLD, double CHANCE, double EPS, 
            int enumMediaType, int enumMethodType);
public:
    // parameters for simulation
    int_fast64_t NPHOTON;   // number of photons to be simulated
    double THRESHOLD;       // threshold to terminate tracking photon
    double CHANCE;          // chance for photon to be revival

    // constant parameters
    double EPS;             // minimum value to avoid division by zero

    // enum parameters
    int enumMediaType;   // enum variable for media type
    int enumMethodType; // enum variable for simulation method
};


// default setup parameters
Params::Params()
{
    NPHOTON = 10000;
    THRESHOLD = 1.0e-4;
    CHANCE = 0.1;
    EPS = 1.0e-12;
    enumMediaType = MEDIA_UNIFORM;
    enumMethodType = METHOD_MONTECARLO;
}


// custom setup parameters
Params::Params(int_fast64_t NPHOTON = 10000, double THRESHOLD = 1.0e-4, double CHANCE = 0.1, 
            double EPS = 1.0e-12, int enumMediaType = MEDIA_UNIFORM, 
            int enumMethodType = METHOD_MONTECARLO)
{
    this->NPHOTON = NPHOTON;
    this->THRESHOLD = THRESHOLD;
    this->CHANCE = CHANCE;
    this->EPS = EPS;
    this->enumMediaType = enumMediaType;
    this->enumMethodType = enumMethodType;
}

